import sys
import os
#sys.path.append('..')
##
import warnings
warnings.filterwarnings('ignore')
##
import IPython.display as ipd
import matplotlib.pyplot as plt
import matplotlib.image as im
import numpy as np
#### Important tips
# To hear the signal
# ipd.Audio(x, rate=fs)
####
# Funciones auxiliares
path = "code/"
# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(path))
from f_plot import *
Librerías para el tratamiento de la señal de audio en Python¶
LibROSA¶
Una opción para leer audio es utilizar la función de la librería LibROSA: librosa.load().
- Por defecto,
librosa.load()remuestrea la señal de audio a $22050~\mathrm{Hz}$. Si se selecciona la opciónsr=None, se mantiene la frecuencia de muestreo original. - La señal de audio se convierte a un float con valores de amplitud en el rango de $[-1, 1]$.
- La función
librosa.load()utiliza el paquetePySoundFileoaudioread.- Cuando se lee una señal de audio, se intenta utilizar el paquete
PySoundFile. Esto funciona para muchos formatos como WAV, FLAC y OGG. - Sin embargo, no se puede leer señales de audio en formato MP3.
- Si el paquete
PySoundFileno puede leer la señal de audio (por ejemplo, MP3), se emite una advertencia y se utiliza la bibliotecaaudioread. - Cuando está disponible
ffmpegesta biblioteca puede leer archivos MP3.
- Cuando se lee una señal de audio, se intenta utilizar el paquete
import librosa
# Lee wav
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
x, fs = librosa.load(fn_wav, sr=None)
print_plot_play(x, fs, text='Fichero WAV: ')
# Lee mp3
fn_mp3 = os.path.join('audio_formatos/', 'noteC4_Piano.mp3')
x, fs = librosa.load(fn_mp3, sr=None)
print_plot_play(x, fs, text='Fichero MP3: ')
Fichero WAV: Fs = 11025, x.shape = (45504,), x.dtype = float32
Fichero MP3: Fs = 11025, x.shape = (47232,), x.dtype = float32
PySoundFile¶
La biblioteca de audio PySoundFile ofrece funciones para leer y escribir archivos de sonido. En particular, contiene las funciones soundfile.read() y soundfile.write().
- Por defecto, el audio se convierte a un float con valores de amplitud situados en el rango de $[-1, 1]$. Este valor por defecto puede cambiarse usando la palabra clave
dtype. - Cuando se escribe, se utiliza, por defecto, PCM de $16$ bits con signo (
subtype='PCM_16'). - No hay opciones de remuestreo.
- No se pueden leer ficheros
MP3.
import soundfile as sf
# Lee wav
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
x, fs = sf.read(fn_wav)
print_plot_play(x, fs, text='Fichero WAV (por defecto): ')
# Lee wav con dtype= 'int16'
x, fs = sf.read(fn_wav, dtype= 'int16')
print_plot_play(x, fs, text='Fichero WAV (dtype=int16): ')
# Escribe la senal 'int16' y lee la senal por defecto
fn_out = os.path.join('www/', 'noteC4_Piano_int16.wav')
sf.write(fn_out, x, fs)
x, Fs = sf.read(fn_out)
print_plot_play(x, fs, text='Escribe una señal (int16) y lee posteriormente esta señal (por defecto): ')
Fichero WAV (por defecto): Fs = 11025, x.shape = (45504,), x.dtype = float64
Fichero WAV (dtype=int16): Fs = 11025, x.shape = (45504,), x.dtype = int16
Escribe una señal (int16) y lee posteriormente esta señal (por defecto): Fs = 11025, x.shape = (45504,), x.dtype = float64
# Genera una senal
fs = 8000
x = 0.5 * np.cos(2 * np.pi * 440 * np.arange(0, fs) / fs)
x[2000:2200] = 2
print_plot_play(x, fs, text='Señal generada: ')
# Escribe una senal
# Por defecto: 'PCM_16'
# Es equivalente a preprocesar (dithering + quantization)
# x = np.int16(np.round(x*(2**15)))
#
print('Escribe el fichero (por defecto):', sf.default_subtype('WAV'))
fn_out = os.path.join('www/', 'audio_sine.wav')
sf.write(fn_out, x, fs, subtype='PCM_16')
# Lee la senal generada
x, fs = sf.read(fn_out)
print_plot_play(x, fs, text='Señal después de ser escrita y leeida: ')
Señal generada: Fs = 8000, x.shape = (8000,), x.dtype = float64
Escribe el fichero (por defecto): PCM_16 Señal después de ser escrita y leeida: Fs = 8000, x.shape = (8000,), x.dtype = float64
SciPy¶
La librería Scipy ofrece el módulo scipy.io.wavfile(), que permite leer y escribir archivos de tipo wav. Sin embargo, no todas las variantes del formato wav son compatibles. Por ejemplo, no se admiten archivos WAV de $24$ bits enteros. Además, determinados campos de metadatos de un archivo wav también pueden dar lugar a errores. Por lo tanto, no recomendamos esta opción.
from scipy.io import wavfile
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
fs, x = wavfile.read(fn_wav)
print_plot_play(x, fs, text='Señal leida: ')
Señal leida: Fs = 11025, x.shape = (45504,), x.dtype = int16
libfmp¶
Esta librería incluye algunas funciones para leer y escribir señales de audio: utiliza la librería librosa para cargar los ficheros de audio y la librería PySoundFile para escribir audio.
import libfmp.b
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
fn_out = os.path.join('www/', 'noteC4_Piano.b.wav')
x, fs = libfmp.b.read_audio(fn_wav)
libfmp.b.write_audio(fn_out, x, fs)
x, fs = libfmp.b.read_audio(fn_out)
print_plot_play(x, fs, text='Señal después de ser escrita y leida: ')
Señal después de ser escrita y leida: Fs = 11025, x.shape = (45504,), x.dtype = float32
Otras librerías¶
Librería PyAudio: Se utiliza para la entrada y salida de audio y puede generar tonos de una frecuencia específica manipulando transmisiones de audio. Proporciona enlaces de Python para PortAudio, la API de audio multiplataforma.
Librería Simpleaudio: Esta es una biblioteca sencilla para reproducir archivos WAV o matrices NumPy. Puedes crear un sonido a una determinada frecuencia y reproducirlo.
Librería Sounddevice: Esta biblioteca proporciona enlaces para la biblioteca PortAudio y se puede usar para reproducir y grabar sonido en un formato de matriz NumPy, lo que permite un control preciso sobre la frecuencia.
Librería Wave: Parte de la biblioteca estándar de Python, se usa para leer y escribir archivos WAV. Puede usarse en combinación con otras bibliotecas como Numpy para generar tonos de frecuencias específicas y guardarlos.
Librería mir_eval: Esta biblioteca proporciona funciones para los sistemas de recuperación de información musical (Music Information Retrieval, MIR).
Formatos de audio¶
Existe un gran número de formatos de audio en la actualidad.
The evolution of physical music formats
MP3¶
El formato MPEG-1 Audio Layer III o MPEG-2 Audio Layer III es el formato de compresión de audio más utilizado debido a su extraordinario grado de compresión y alta calidad.
- Velocidad de muestreo de archivos MPEG-1: 32, 44.1 y 48 kHz.
- Velocidad de muestreo de archivos MPEG-2: 16, 22.05 y 24 kHz.
El umbral mínimo de audición humano no es lineal. De acuerdo con la ley de Fletcher y Munsen, se representa por una curva entre $2$ y $5$ KHz. Cualquier sonido situado fuera de este margen puede no codificarse, ya que no será percibido de todas formas. El proceso de codificación utilizado en MP3 se denomina “codificación perceptual” y se basa en eliminar aquellos datos que no serán percibidos por el oyente debido a las pequeñas imperfecciones del oído humano. La base matemática es muy compleja y conlleva un proceso de cómputo lento.
Aplicando las técnicas del MP3, se consigue reducir el tamaño que ocupa una pieza musical en un factor entre $10(12):1$.
WAV¶
WAV (Waveform Audio File Format) es un formato creado por Microsoft que, normalmente, no realiza una compresión de datos. Si se utiliza compresión, se suelen usar los algoritmos de codificación PCM (Pulse Code Modulation) o ADPCM (Adaptive Differential Pulse Code Modulation). Admite archivos mono y estéreo a diversas resoluciones y velocidades de muestreo.
Es un formato que aporta una excelente calidad pero genera ficheros de gran tamaño. Cada muestra de audio se guarda como un número entero de 16 bits (a veces en 32 bits). Esto es, los sonidos con extensión WAV (.wav) son sonidos con una calidad muy buena, concretamente, su calidad es unas 13 veces inferior a un sonido original. Por tanto, consigue una compresión de excelente calidad pero genera ficheros de gran tamaño. Por ejemplo, una canción extraída de un CD, a $16$ bytes, $44100$ Hz y estéreo, puede ocupar entre $20$ y $30$ MB.
Ejemplo 1¶
LRMonoPhase4.wav(Left, Right, In-Phase, Out-Of-Phase Test, 48k/16, WAV, 7.3MB, 39 segundos). Grabado con un micrófono de cinta RCA BK-5b (ribbon micro), un mezclador FP-24 y un Mac PowerBook.
audio, fs = librosa.load("audio_formatos/Ejemplo1/LRMonoPhase4.wav")
plot_ss(x=audio, fs=fs, titulo='LRMonoPhase4.wav');
ipd.Audio(audio, rate=fs)
LRMonoPhase4.mp3. La misma señal en formato MP3.
audio, fs = librosa.load("audio_formatos/Ejemplo1/LRMonoPhase4.mp3")
plot_ss(x=audio, fs=fs, titulo='LRMonoPhase4.mp3');
ipd.Audio(audio, rate=fs)
Ejemplo 2¶
WAV-MP3.wav(11 segundos, cambia de WAV 44100Hz sin comprimir a MP3 11000Hz)
audio, fs = librosa.load("audio_formatos/Ejemplo3/WAV-MP3.wav")
plot_ss(x=audio, fs=fs, titulo='WAV-MP3.wav');
ipd.Audio(audio, rate=fs)
organfinale.wav(Solo de órgano, 13 segundos, WAV, 44100Hz/32-bit, estéreo, 4.4MB)
lista_audio = []
lista_fs = []
titulos = []
audio, fs = librosa.load("audio_formatos/Ejemplo3/organfinale.wav")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('organfinale.wav')
ipd.Audio(audio, rate=fs)
organfinale.mp3(Solo de órgano, 13 segundos, MP3, 44100Hz/32-bit, estéreo, 208KB)
audio, fs = librosa.load("audio_formatos/Ejemplo3/organfinale.mp3")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('organfinale.mp3')
ipd.Audio(audio, rate=fs)
plotN_ss(lista_audio, lista_fs, titulos)
32.mp3(Click Track, 32 segundos, MP3, 44100Hz/32-bit, mono, 504KB)
audio, fs = librosa.load("audio_formatos/Ejemplo3/32.mp3")
plot_ss(x=audio, fs=fs, titulo='32.mp3');
ipd.Audio(audio, rate=fs)
c304-2.wav(Echo test, 49 segundos, WAV, 48k/16, estéreo, 9.1MB)
audio, fs = librosa.load("audio_formatos/Ejemplo3/c304-2.wav")
plot_ss(x=audio, fs=fs, titulo='c304-2.wav');
ipd.Audio(audio, rate=fs)
AIFF¶
El formato AIFF (Audio Interchange File Format) desarrollado por Apple no utiliza compresión y emplea una modulación por impulsos codificados (PCM). Es un formato de alta calidad pero genera ficheros de gran tamaño. Utiliza alrededor de 10 MB para un minuto de audio estéreo con una frecuencia de muestreo de 44.1kHz y 16 bits lo cual genera audios de alta calidad pero de gran tamaño.
Además, este estándar da soporte a bucles para notas musicales para su uso en aplicaciones musicales o samplers.
Ejemplo 2¶
piano2.wav(Piano Trill, 48k/16, Little Endian, WAV, estéreo, 1.2MB). 6.3 segundos, siete notas de piano.
lista_audio = []
lista_fs = []
titulos = []
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2.wav")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2.wav')
ipd.Audio(audio, rate=fs)
piano2.aif(Piano Trill, 48k/16, Big Endian, AIFF, estéreo, 1.2MB). Formato Apple AIFF.
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2.aif")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2.aif')
ipd.Audio(audio, rate=fs)
piano2-CoolEdit.mp3(Piano Trill, 48k/128kb-MP3, 100KB). Creado por CoolEdit 2000, Fraunhofer License.
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2-CoolEdit.mp3")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2-CoolEdit.mp3')
ipd.Audio(audio, rate=fs)
piano2-Audacity1.2.5.mp3(Piano Trill, 48k/128kb-MP3, 100KB). Creado por lame.
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2-Audacity1.2.5.mp3")
lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2-Audacity1.2.5.mp3')
ipd.Audio(audio, rate=fs)
plotN_ss(lista_audio, lista_fs, titulos)
OGG¶
Este formato desarrollado por la Fundación Xiph.org. El formato OGG puede contener audio y vídeo y tiene un grado de compresión similar al MP3 pero, según los expertos en música, la calidad de reproducción es ligeramente superior.
Otros formatos¶
- AAC (Advanced Audio Coding): Este formato es similar al MP3 aunque más eficiente (menor espacio, misma calidad). Mejor compresión que MP3 especialmente para velocidades de transmisión menores que $128$ kbit/s.
- HE-AAC (High-Efficiency Advanced Audio Coding): Es una variación de AAC optimizado para velocidades de transmisión bajas (streaming de audio).
- AMR (Adaptive Multi-Rate): Formato optimizado para voz (velocidad de transmisión baja).
- ALAC (Apple Lossless): Formato sin pérdida en cualquier calidad y una tasa de compresión del $40-60$ % del tamaño original.
- iLBC (Internet Low Bitrate Codec): Proporciona una buena calidad de voz y es robusto frente a pérdida de paquetes. Utiliza un algoritmo de predicción lineal adaptativo independiente por bloques.
- Real Audio: Formato creado por RealNetworks muy utilizado para transmisiones por internet en tiempo real.
- VQF (TwinVQ, Transform-domain Weighted Interleaved Vector Quantization): Es un formato comercializado por Yamaha. Es menos popular que MP3 pero proporciona menor tamaño, mayor calidad y mayor número de recursos. Son aproximadamente un $30-35$ % más pequeños que los archivos MP3 pero requieren de mayor capacidad de computación que estos.
- WMA (Windows Media Audio): Este formato, creado por Microsoft, proporciona una mejor calidad de sonido que MP3 a la misma tasa de bits.
Referencias¶
Muchos de los audios utilizados han sido elegidos de la siguiente página: SoundTests.
Formatos de audio¶
- Formatos de ficheros de audio
- Comparación entre los formatos de audio
- Códecs de audio
- Lista de códecs de audio
- Diferencia entre WAV y MP3
- Calidad de sonido MP3 128-320
MP3¶
WAV¶
AIFF¶
OGG¶
Otros formatos¶
- wikipedia AAC
- Fraunhofer AAC
- wikipedia HE-AAC
- wikipedia AMR
- wikipedia ALAC
- wikipedia iLBC
- wikipedia Real Audio
- wikipedia VQF
- wikipedia WMA